import axios from 'axios'
//引入基址和超时时间
import { BASE_URL, TIMEOUT } from './config'
// vant的toast提示框组件，大家可根据自己的ui组件更改。
import { showToast } from 'vant'; // 统一配置提示信息

import router from '@/router'

import { getLocalToken, clearToken } from '@/utils/token'


//  直接创建实例 的方式
// http://121.89.205.189:3000/apidoc/#api-Banner-GetBannerList
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
// axios.defaults.headers.get['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
// axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
const instance = axios.create({
    baseURL: BASE_URL, // 配置基础地址
    timeout: TIMEOUT,                  // 配置响应超时
    // headers: {
    //     // Authorization: Authorization,
    //     'Content-Type': 'application/x-www-form-urlencoded'
    // }
});

const fileUploadChangeHeaders = axios.create({
    baseURL: BASE_URL, // 配置基础地址
    timeout: TIMEOUT,                  // 配置响应超时
    headers: {
        // Authorization: Authorization,
        "Content-Type": "multipart/form-data"
    }
});

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // return config;
    //  所有的api请求都需要携带token  
    // token 获取的地方 ？？ 本地缓存 /pinia
    let token = getLocalToken()
    token && (config.headers.token = token)
    return config
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use((response) => {
    // console.log('router', router.options)
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    //   请求成功
    if (response.code !== 200) showToast({
        message: response.data.msg,
        duration: 1000,
    })
    return response.data;
}, (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么

    console.log(error)

    switch (error.response.status) {
        case 401:
            // 401: 未登录
            // 未登录则跳转登录页面，并携带当前页面的路径
            // 在登录成功后返回当前页面，这一步需要在登录页操作。 
            //  router.replace('/login?redirect='')
            showToast({
                message: '未登录',
                duration: 1000,
            })
            router.replace({
                name: 'guide', query: {
                    redirect: router.options.history.state.current
                }
            })

            break;

        case 403:
            // 403 token过期

            // 登录过期对用户进行提示
            showToast({
                message: '登录过期',
                duration: 1000,
            })
            // 清除本地token和清空vuex/pinia中token对象
            // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面 
            clearToken()
            // removeToken() // 清除pinia中的数据
            setTimeout(() => {
                router.replace({
                    name: 'guide', query: {
                        redirect: router.options.history.state.current
                    }
                })
            }, 1000)

        // 跳转登录页面 

        case 404:
            // 404请求不存在

            showToast({
                message: '清除错误 页面不存在',
                duration: 1000,
            })
            router.push({ name: 'NotFound' })


        // 其他错误，直接抛出错误提示
        default:

            showToast({
                message: '其他错误',
                duration: 1000,
            })




    }
    return Promise.reject(error);



});

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get(url, params) {
    return instance.get(url, { params })
}

/** 
 * post方法，对应post请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
export function post(url, data) {
    return instance.post(url, data)
}
export function fileUploadPost(url, data) {
    return fileUploadChangeHeaders.post(url, data)
}